import cv2
import numpy as np

if __name__ == "__main__":
    image_path = ("chess.jpg")  # 替换为实际图像路径

    img = cv2.imread(image_path, 0)
    # 1. 降噪处理（核心：保证边缘纯净）
    # 高斯模糊参数可根据噪声情况调整（ksize为奇数，sigma控制模糊程度）
    blurred = cv2.medianBlur(img, 9)

    # 2. 分别计算水平和垂直边缘（Sobel算子）
    # 垂直边缘：对水平方向的灰度变化敏感（dx=0, dy=1）
    vertical = cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize=3)
    vertical = np.uint8(np.absolute(vertical))  # 取绝对值并转为uint8

    # 水平边缘：对垂直方向的灰度变化敏感（dx=1, dy=0）
    horizontal = cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize=3)
    horizontal = np.uint8(np.absolute(horizontal))  # 取绝对值并转为uint8

    # 3. 阈值处理：过滤弱边缘，增强纯净度（可根据图像调整阈值）
    _, vertical = cv2.threshold(vertical, 60, 255, cv2.THRESH_BINARY)
    _, horizontal = cv2.threshold(horizontal, 60, 255, cv2.THRESH_BINARY)

    # 4. 合并水平和垂直边缘（得到完整边缘图）
    combined_edges = cv2.bitwise_or(horizontal, vertical)

    # 5. 显示结果（原图 + 水平边缘 + 垂直边缘 + 合并边缘）
    cv2.imshow("chess1", img)
    cv2.imshow("adj_chess", combined_edges)
    cv2.imwrite("adj_chess.jpg", combined_edges)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


